import user.AdminUser;
import user.NormalUser;
import user.ProxyUser;
import user.User;
import user.factory.AdminUserFactory;
import user.factory.IUserFactory;
import user.factory.NormalUserFactory;

import java.util.Scanner;

public class LibrarySystem {
    public static void main(String[] args) {
        //工厂模式高效，修改容易
        IUserFactory adminUserFactory =new AdminUserFactory();
        User adminUser=adminUserFactory.createUser("刘备",1);
        IUserFactory normalUserFactory=new NormalUserFactory();
        User normalUser1=normalUserFactory.createUser("关羽",2);
        User normalUser2=normalUserFactory.createUser("张飞",3);
        //使用代理模式来控制对象的访问
        ProxyUser proxyUserAdmin= new ProxyUser(adminUser);
        ProxyUser proxyUserNormalG= new ProxyUser(normalUser1);
        ProxyUser proxyUserNormalZ= new ProxyUser(normalUser2);
        LibrarySystem librarySystem = new LibrarySystem();

        ProxyUser currentUser = librarySystem.selectProxyRole(proxyUserAdmin,proxyUserNormalG,proxyUserNormalZ);

        while (true) {
            int choice = currentUser.display();
            //如何实现 选择几（choice） 就执行 哪个用户（currentUser）的哪个操作？

            currentUser.handleOperation(choice);
        }

    }
    public static void main1(String[] args) {
        //直接创建管理员用户
        User adminUser=new AdminUser("刘备",1);
        //直接创建普通用户
        User normalUser1=new NormalUser("关羽",2);
        User normalUser2=new NormalUser("张飞",3);
        //这种模式不高效，修改代码较为复杂
    }
    //选择对应角色进行登录
    public ProxyUser selectProxyRole(ProxyUser proxyUserAdmin, ProxyUser proxyUserNormalW,ProxyUser proxyUserNormalL){
        System.out.println("请选择角色进行登录:");
        System.out.println("1.管理员\n2.普通用户(关羽)\n3.普通用户(张飞)\n4.退出系统");
        ProxyUser currentUser=null;//初始化当前用户对象为null,用于存储最终选择的角色
        Scanner scanner=new Scanner(System.in);//创建Scanner对象，用于读取用户输入
        int choice=scanner.nextInt();//读取用户输入的整数，作为角色选择的编号
        switch (choice){
            case 1:
                currentUser=proxyUserAdmin;
                break;
            case 2:
                currentUser=proxyUserNormalW;
                break;
            case 3:
                currentUser=proxyUserNormalL;
                break;
            case 4:
                System.exit(0);//退出系统的操作命令(终止java虚拟机，后续代码不会执行)
                System.out.println("系统已退出...");//这行代码永远都没有机会执行，因为System.exit(0)已终止程序
                break;//不可达代码
            default:       //处理无效输入(非1-4的数字)
                break;        //不做任何处理，直接退出
        }
        return currentUser;   //返回最终的用户角色对象
    }
}
